<template>
    <a-modal v-model:visible="visible" :unmount-on-close="true" title="创建数据库" draggable @cancel="handleCancel" :closable="false"
             @before-ok="handleOk" :width="900">
        <a-form ref="formRef" :model="form" layout="vertical">
            <a-row :gutter="16">
                <a-col :span="24">
                    <a-form-item field="db_name" label="数据库名称"
                                 :rules="[{required:true,message:'请输入数据库名称'}]">
                        <a-input v-model="form.db_name" placeholder="请输入数据库名称"/>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="buffer" label="写入内存池"
                                 tooltip="BUFFER: 一个 VNODE 写入内存池大小，单位为 MB，默认为 256，最小为 3，最大为 16384">
                        <a-input-number v-model="form.buffer" :hide-button="true" :min="3" :max="16384">
                            <template #append>MB</template>
                        </a-input-number>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="cachemodel" label="子表缓存模式"
                                 tooltip="CACHEMODEL：表示是否在内存中缓存子表的最近数据。默认为 none。none：表示不缓存。last_row：表示缓存子表最近一行数据。这将显著改善 LAST_ROW 函数的性能表现。last_value：表示缓存子表每一列的最近的非 NULL 值。这将显著改善无特殊影响（WHERE、ORDER BY、GROUP BY、INTERVAL）下的 LAST 函数的性能表现。both：表示同时打开缓存最近行和列功能。">
                        <a-select v-model="form.cachemodel" :allow-clear="true">
                            <a-option>none</a-option>
                            <a-option>last_row</a-option>
                            <a-option>last_value</a-option>
                            <a-option>both</a-option>
                        </a-select>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="cachesize" label="子表缓存大小"
                                 tooltip="CACHESIZE：表示每个 vnode 中用于缓存子表最近数据的内存大小。默认为 1 ，范围是[1, 65536]，单位是 MB">
                        <a-input-number v-model="form.cachesize" :hide-button="true" :min="1" :max="65536">
                            <template #append>MB</template>
                        </a-input-number>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="comp" label="文件压缩标志"
                                 tooltip="COMP：表示数据库文件压缩标志位，缺省值为 2，取值范围为 [0, 2]。0：表示不压缩。1：表示一阶段压缩。2：表示两阶段压缩。">
                        <a-select v-model="form.comp" :allow-clear="true">
                            <a-option>0</a-option>
                            <a-option>1</a-option>
                            <a-option>2</a-option>
                        </a-select>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="duration" label="存储时间跨度"
                                 tooltip="DURATION：数据文件存储数据的时间跨度。可以使用加单位的表示形式，如 DURATION 100h、DURATION 10d 等，支持 m（分钟）、h（小时）和 d（天）三个单位。不加时间单位时默认单位为天，如 DURATION 50 表示 50 天。">
                        <a-input v-model="form.duration"/>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="wal_fsync_period" label="落盘周期"
                                 tooltip="当 WAL 参数设置为 2 时，落盘的周期。默认为 3000，单位毫秒。最小为 0，表示每次写入立即落盘；最大为 180000，即三分钟。">
                        <a-input-number v-model="form.wal_fsync_period" :hide-button="true" :min="0" :max="180000">
                            <template #append>毫秒</template>
                        </a-input-number>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="maxrows" label="记录最大条数"
                                 tooltip="MAXROWS：文件块中记录的最大条数，默认为 4096 条。">
                        <a-input-number v-model="form.maxrows" :hide-button="true"/>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="minrows" label="记录最小条数"
                                 tooltip="MINROWS：文件块中记录的最小条数，默认为 100 条。">
                        <a-input-number v-model="form.minrows" :hide-button="true"/>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="keep" label="文件保存天数"
                                 tooltip="KEEP：表示数据文件保存的天数，缺省值为 3650，取值范围 [1, 365000]，且必须大于或等于 DURATION 参数值。数据库会自动删除保存时间超过 KEEP 值的数据。KEEP 可以使用加单位的表示形式，如 KEEP 100h、KEEP 10d 等，支持 m（分钟）、h（小时）和 d（天）三个单位。也可以不写单位，如 KEEP 50，此时默认单位为天。企业版支持多级存储功能, 因此, 可以设置多个保存时间（多个以英文逗号分隔，最多 3 个，满足 keep 0 <= keep 1 <= keep 2，如 KEEP 100h,100d,3650d）; 社区版不支持多级存储功能（即使配置了多个保存时间, 也不会生效, KEEP 会取最大的保存时间）。">
                        <a-input v-model="form.keep"/>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="pages" label="缓存页个数"
                                 tooltip="PAGES：一个 VNODE 中元数据存储引擎的缓存页个数，默认为 256，最小 64。一个 VNODE 元数据存储占用 PAGESIZE * PAGES，默认情况下为 1MB 内存。">
                        <a-input-number v-model="form.pages" :hide-button="true" :min="64"/>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="pagesize" label="缓存页大小"
                                 tooltip="PAGESIZE：一个 VNODE 中元数据存储引擎的页大小，单位为 KB，默认为 4 KB。范围为 1 到 16384，即 1 KB 到 16 MB。">
                        <a-input-number v-model="form.pagesize" :hide-button="true" :min="1" :max="16384">
                            <template #append>KB</template>
                        </a-input-number>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="precision" label="时间戳精度"
                                 tooltip="PRECISION：数据库的时间戳精度。ms 表示毫秒，us 表示微秒，ns 表示纳秒，默认 ms 毫秒。">
                        <a-select v-model="form.precision" :allow-clear="true">
                            <a-option>ms</a-option>
                            <a-option>us</a-option>
                            <a-option>ns</a-option>
                        </a-select>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="replica" label="数据库副本数"
                                 tooltip="REPLICA：表示数据库副本数，取值为 1 或 3，默认为 1。在集群中使用，副本数必须小于或等于 DNODE 的数目。">
                        <a-select v-model="form.replica" :allow-clear="true">
                            <a-option>1</a-option>
                            <a-option>3</a-option>
                        </a-select>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="retentions" label="聚合周期保存时长"
                                 tooltip="RETENTIONS：表示数据的聚合周期和保存时长，如 RETENTIONS 15s:7d,1m:21d,15m:50d 表示数据原始采集周期为 15 秒，原始数据保存 7 天；按 1 分钟聚合的数据保存 21 天；按 15 分钟聚合的数据保存 50 天。目前支持且只支持三级存储周期。">
                        <a-input v-model="form.retentions"/>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="wal_level" label="WAL级别"
                                 tooltip="WAL_LEVEL：WAL 级别，默认为 1。1：写 WAL，但不执行 fsync。2：写 WAL，而且执行 fsync。">
                        <a-select v-model="form.wal_level" :allow-clear="true">
                            <a-option>1</a-option>
                            <a-option>2</a-option>
                        </a-select>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="vgroups" label="初始vgroup数目" tooltip="VGROUPS：数据库中初始 vgroup 的数目。">
                        <a-input-number v-model="form.vgroups" :hide-button="true"/>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="single_stable" label="仅单超级表"
                                 tooltip="SINGLE_STABLE：表示此数据库中是否只可以创建一个超级表，用于超级表列非常多的情况。0：表示可以创建多张超级表。1：表示只可以创建一张超级表。">
                        <a-select v-model="form.single_stable" :allow-clear="true">
                            <a-option>0</a-option>
                            <a-option>1</a-option>
                        </a-select>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="stt_trigger" label="落盘合并个数"
                                 tooltip="STT_TRIGGER：表示落盘文件触发文件合并的个数。默认为 1，范围 1 到 16。对于少表高频场景，此参数建议使用默认配置，或较小的值；而对于多表低频场景，此参数建议配置较大的值。">
                        <a-input-number v-model="form.stt_trigger" :hide-button="true" :min="1" :max="16"/>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="table_prefix" label="忽略前缀长度"
                                 tooltip='TABLE_PREFIX：当其为正值时，在决定把一个表分配到哪个 vgroup 时要忽略表名中指定长度的前缀；当其为负值时，在决定把一个表分配到哪个 vgroup 时只使用表名中指定长度的前缀；例如，假定表名为 "v30001"，当 TSDB_PREFIX = 2 时 使用 "0001" 来决定分配到哪个 vgroup ，当 TSDB_PREFIX = -2 时使用 "v3" 来决定分配到哪个 vgroup'>
                        <a-input-number v-model="form.table_prefix" :hide-button="true"/>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="table_suffix" label="忽略后缀长度"
                                 tooltip='TABLE_SUFFIX：当其为正值时，在决定把一个表分配到哪个 vgroup 时要忽略表名中指定长度的后缀；当其为负值时，在决定把一个表分配到哪个 vgroup 时只使用表名中指定长度的后缀；例如，假定表名为 "v30001"，当 TSDB_SUFFIX = 2 时 使用 "v300" 来决定分配到哪个 vgroup ，当 TSDB_SUFFIX = -2 时使用 "01" 来决定分配到哪个 vgroup。'>
                        <a-input-number v-model="form.table_suffix" :hide-button="true"/>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="tsdb_pagesize" label="引擎页大小"
                                 tooltip="TSDB_PAGESIZE：一个 VNODE 中时序数据存储引擎的页大小，单位为 KB，默认为 4 KB。范围为 1 到 16384，即 1 KB到 16 MB。">
                        <a-input-number v-model="form.tsdb_pagesize" :hide-button="true" :min="1" :max="16384">
                            <template #append>KB</template>
                        </a-input-number>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="wal_retention_period" label="保留最大时长"
                                 tooltip="WAL_RETENTION_PERIOD: 为了数据订阅消费，需要WAL日志文件额外保留的最大时长策略。WAL日志清理，不受订阅客户端消费状态影响。单位为 s。默认为 3600，表示在 WAL 保留最近 3600 秒的数据，请根据数据订阅的需要修改这个参数为适当值。">
                        <a-input-number v-model="form.wal_retention_period" :hide-button="true">
                            <template #append>s</template>
                        </a-input-number>
                    </a-form-item>
                </a-col>
                <a-col :span="6">
                    <a-form-item field="wal_retention_size" label="保留最大容量"
                                 tooltip="WAL_RETENTION_SIZE：为了数据订阅消费，需要WAL日志文件额外保留的最大累计大小策略。单位为 KB。默认为 0，表示累计大小无上限。">
                        <a-input-number v-model="form.wal_retention_size" :hide-button="true">
                            <template #append>KB</template>
                        </a-input-number>
                    </a-form-item>
                </a-col>
            </a-row>
        </a-form>
    </a-modal>
</template>

<script setup lang="ts">

import {reactive, ref} from 'vue';
import {doQuery} from "../../../scripts/mapper";
import type {QueryResult} from "../../../scripts/type";
import {Message} from "@arco-design/web-vue";

const visible = ref(false);

let form = reactive({
    db_name: undefined,
    buffer: undefined,
    cachemodel: undefined,
    cachesize: undefined,
    comp: undefined,
    duration: undefined,
    wal_fsync_period: undefined,
    maxrows: undefined,
    minrows: undefined,
    keep: undefined,
    pages: undefined,
    pagesize: undefined,
    precision: undefined,
    replica: undefined,
    retentions: undefined,
    wal_level: undefined,
    vgroups: undefined,
    single_stable: undefined,
    stt_trigger: undefined,
    table_prefix: undefined,
    table_suffix: undefined,
    tsdb_pagesize: undefined,
    wal_retention_period: undefined,
    wal_retention_size: undefined
});

const formRef = ref()
const emits = defineEmits(['done'])


const add = () => {
    visible.value = true;
};

const handleCancel = () => {
    visible.value = false;
}

const handleOk = (done) => {
    formRef.value.validate((errors) => {
        if (!errors) {
            let sql = "CREATE DATABASE IF NOT EXISTS " + form.db_name + " "
            for (let formKey in form) {
                if (formKey === "db_name") continue;
                if (form[formKey] !== undefined && form[formKey] !== null && form[formKey] !== "") {
                    sql += (formKey.toUpperCase() + " " + form[formKey] + " ");
                }
            }
            sql += ";"
            doQuery(sql).then((result: QueryResult) => {
                if (result.success && result.data) {
                    Message.success("数据库创建成功");
                    emits('done')
                    done()
                } else {
                    Message.error("数据库创建失败" + (result.message ? (": " + result.message) : ""))
                    done(false)
                }
            })
        } else {
            done(false)
        }
    })
};

defineExpose({
    add
})


</script>
